<?php
/* 数据库组操作方法【并不对用户开放】
 * 每组数据库一定会有一个主数据库master
 * 
 * 默认情况下:
 * 有数据变更的方法，如update,create,del,execute方法均自动取master，
 * 查询则随机取从数据库，没有从数据库时，直接以主数据库master执行
 * 
 * 指定数据库：
 * 当初始化时指定$dbAlias或以方法setAlias指定数据库，表示强制以指定数据库执所有方法,
 * 一般用于指定主数据执行find等查询方法
 * 
 */
class DBGroup{
	private $dbConfig = null;
	private $slaves = null;	
	private $dbPool = array();
	
	private $dbAlias = '';
	
	/*数据库组初始化方法
	 * @param array $dbConfig 数据库组配置(yaml)对应数组
	 * @param string $dbAlias 指定数据库别名
	 */
	public function __construct($dbConfig,$dbAlias=''){
		$this->dbConfig = $dbConfig;
		$this->slaves = array_keys($dbConfig); 
		unset($this->slaves[0]);
		$this->setAlias($dbAlias);
	}
	
	/*设置数据库别名,指定具体数据库
	 * 用于强制指定主数据库,即master
	 */
	public function setAlias($dbAlias){
		$this->dbAlias = $dbAlias;
	}
	
	public function __call($fun,$args){
		if(!$this->dbAlias){
			//如果为数据修改，则调用主数据库;如果为从数据库，则随机取数据库别名
			$this->dbAlias = in_array($fun,array('update','create','del','execute'))?'master':$this->slaves[array_rand($this->slaves)];	
		}
				
		return call_user_method_array($fun,$this->_database(),$args);
	}
	
	//取数据库对象
	private function _database(){
		$dbAlias = $this->dbAlias?$this->dbAlias:'master';
			//已初始化
		if($this->dbPool[$dbAlias]){
			return $this->dbPool[$dbAlias];
		}	
		
		//取数据库配置
		$dbConfig = $this->dbConfig[$dbAlias];	
		$dbConfig = $dbConfig[RUN_MODEL];
		
		//初始化数据库对象
		$class = $dbConfig['dbClass'];
		$this->dbPool[$dbAlias] = new $class($dbConfig['dbHost'],$dbConfig['dbUser'],$dbConfig['dbPassword'],$dbConfig['dbName'],$dbConfig['dbCharset']);
		
		return $this->dbPool[$dbAlias];
	}
	
	/*取数据库链接
	 * 
	 */
	function getConnect(){
		return $this->_database()->conn;
	}
}